package com.spring5.service;

import com.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * propagation：事务传播行为
 *  1、事务方法：对数据库表数据进行变化的操作
 *
 * isolation：事务隔离级别
 *  1、事务有特性成为隔离性。多事务操作之间不会产生影响。不考虑隔离性会产生很多问题。
 *  2、有三个读问题：脏读、不可重复读、幻读
 *     脏读：一个未提交事务读取到另一个未提交事务的数据
 *     不可重复读：一个未提交事务读取到另一提交事务修改数据
 *     幻读：一个未提交事务读取到另一提交事务添加的数据
 */
@Service
@Transactional(
    readOnly = false,
    timeout = -1,
    propagation = Propagation.REQUIRED,
    isolation = Isolation.REPEATABLE_READ)
public class UserService {

  // 注入dao
  @Autowired private UserDao userDao;

  // 转账的方法
  public void accountMoney() {
    //        try {
    // 第一步 开启事务

    // 第二步 进行业务操作
    // lucy少100
    userDao.reduceMoney();

    // 模拟异常
    int i = 10 / 0;

    // mary多100
    userDao.addMoney();

    // 第三步 没有发生异常，提交事务
    //        }catch(Exception e) {
    // 第四步 出现异常，事务回滚
    //        }
  }
}
